package xyz.xtt.exchange.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

/*作用是把当前类标识为一个切面供容器读取*/
@Slf4j
@Aspect
@Component
public class AopAdvice {

	/*
	 * 针对所有控制器的方法添加aop 1,* com.nl.demo.controllers.*.*(..))解析 2，第一个*是返回任意类型
	 * 3，com.nl.demo.controllers是包路径，针对所有的控制器 4，第二个*是任意类 5，第三个*是任意方法 6，(..)的任意参数
	 */
	/* @Pointcut("execution (* com.nl.demo.controllers.*.*(..))") */

	/* 针对特定控制器，AopTestController的特定方法， */
//	@Pointcut("execution (* com.nl.testmybatis.controllers.AopTestController.sayHello(..))")
	@Pointcut("execution (* xyz.xtt.exchange.controller.IndexController.kafka(..))")
	public void test() {

	}

	/* 标识一个前置增强方法，相当于BeforeAdvice的功能 */
	@Before("test()")
	public void beforeAdvice(JoinPoint joinPoint) {
		System.out.println("beforeAdvice...");
		log
				.info("Entering method: {}.{} with arguments: {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint
						.getSignature()
						.getName(), joinPoint.getArgs());
	}

	/* final增强，不管是抛出异常或者正常退出都会执行 */
	@After("test()")
	public void afterAdvice() {
		System.out.println("afterAdvice...");
	}

	/* 环绕增强，相当于MethodInterceptor */
	@Around("test()")
	public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
		System.out.println("before");
		try {
			proceedingJoinPoint.proceed();
		} catch (Throwable t) {
			t.printStackTrace();
		}
		System.out.println("after");
	}

}